// 封装 vuex 子模块 user：用来管理所有与用户相关的状态
// 导入操作 token 的方法
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth.js'
// 导入登录接口
import { loginApi, getInfoApi } from '@/api/user'
// 导入获取信息的方法
import { getEmployeesApi } from '@/api/employees'

const state = {
  // 用来存储用户登录之后的 token
  token: getToken(), // 如果在浏览器中的 cookie 保存了 token ，直接取出来使用
  // 保存用户信息
  userInfo: {}
}
const mutations = {
  // 保存 token
  setToken (state, payload) {
    // token 在保存在几个位置： cookie 中 & vuex 中
    // 保存到 vuex 中
    state.token = payload
    // 保存 cookie 中
    setToken(payload)
    // 保存 token 产生的时间戳
    setTimeStamp()
  },
  // 清除 token
  removeToken (state) {
    // 从 vuex 中清除
    state.token = null
    // 从 cookie 中清除
    removeToken()
  },
  // 保存用户信息
  saveUserInfo (state, payload) {
    state.userInfo = payload
  },
  // 清除用户信息
  removeUserInfo (state) {
    state.userInfo = {}
  }
}
const actions = {
  // 完成登出
  logout (context) {
    // 删除 token
    context.commit('removeToken')
    // 删除用户信息
    context.commit('removeUserInfo')
  },
  // 完成登录
  //  payload: 登录的信息
  async login (context, payload) {
    try {
      // 1.0 调用登录接口
      const res = await loginApi(payload)
      console.log(res)
      // 2.0 保存 token 状态
      // 判断返回的状态
      if (res.success) {
        const token = res.data
        context.commit('setToken', token)
      }
    } catch (err) {
      console.log(err.message)
      // 把错误抛给 login/index.vue 中的登录方法
      return Promise.reject(err)
    }
  },
  // 获取用户信息
  async getUserInfo (context) {
    // 发送请求到服务器(只获取了一部分的信息)
    const res = await getInfoApi()
    // 再获取另一个部分的信息
    const baseRes = await getEmployeesApi(res.data.userId)
    // 将两个接口的数据进行合并
    const result = { ...res.data, ...baseRes.data }
    // 保存用户信息
    context.commit('saveUserInfo', result)
    // 埋一个伏笔：返回得到的用户信息
    return result
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
